import { useAuthStore } from '@/stores/auth'

/**
 * 权限指令
 * 使用方式：v-permission="'permission:code'"
 * 修饰符：
 * - disabled：没有权限时禁用元素
 * - hide：没有权限时隐藏元素（默认行为）
 */
export default {
  mounted(el, binding) {
    const { value, modifiers } = binding
    const authStore = useAuthStore()

    if (!value) {
      throw new Error('权限指令需要指定权限标识，例如：v-permission="\'user:add\'"')
    }

    // 检查是否为超级管理员
    const isSuperAdmin = checkIsSuperAdmin(authStore)
    const hasPermission = isSuperAdmin || authStore.hasPermission(value)
    if (!hasPermission) {
      if (modifiers.disabled) {
        // 禁用模式
        el.setAttribute('disabled', 'disabled')
        el.classList.add('is-disabled')

        // 如果是按钮，添加禁用样式
        if (el.tagName.toLowerCase() === 'button') {
          el.style.cursor = 'not-allowed'
          el.style.opacity = '0.6'
        }

        // 添加点击事件阻止
        el.addEventListener('click', preventClick, true)
      } else {
        // 隐藏模式（默认）
        hideElement(el)
      }
    }
  },

  updated(el, binding) {
    const { value, modifiers } = binding
    const authStore = useAuthStore()

    if (!value) return

    // 检查是否为超级管理员
    const isSuperAdmin = checkIsSuperAdmin(authStore)
    const hasPermission = isSuperAdmin || authStore.hasPermission(value)

    if (!hasPermission) {
      if (modifiers.disabled) {
        // 禁用模式
        el.setAttribute('disabled', 'disabled')
        el.classList.add('is-disabled')

        // 如果是按钮，添加禁用样式
        if (el.tagName.toLowerCase() === 'button') {
          el.style.cursor = 'not-allowed'
          el.style.opacity = '0.6'
        }

        // 添加点击事件阻止
        el.addEventListener('click', preventClick, true)
      } else {
        // 隐藏模式（默认）
        hideElement(el)
      }
    } else {
      // 有权限时恢复元素状态
      if (modifiers.disabled) {
        el.removeAttribute('disabled')
        el.classList.remove('is-disabled')

        if (el.tagName.toLowerCase() === 'button') {
          el.style.cursor = ''
          el.style.opacity = ''
        }

        el.removeEventListener('click', preventClick, true)
      } else {
        showElement(el)
      }
    }
  },

  beforeUnmount(el, binding) {
    const { modifiers } = binding
    if (modifiers.disabled) {
      el.removeEventListener('click', preventClick, true)
    }
  }
}

/**
 * 检查是否为超级管理员
 * @param {Object} authStore 认证store实例
 * @returns {Boolean} 是否为超级管理员
 */
function checkIsSuperAdmin(authStore) {
  const userInfo = authStore.userInfo

  // 检查用户信息中是否包含角色信息
  if (userInfo && userInfo.roles) {
    // 如果是数组，检查是否包含 super_admin
    if (Array.isArray(userInfo.roles)) {
      return userInfo.roles.some(role => role.code === 'super_admin')
    }
    // 如果是单个角色对象
    else if (userInfo.roles.code) {
      return userInfo.roles.code === 'super_admin'
    }
  }

  // 检查用户信息中的 roleCode 字段
  if (userInfo && userInfo.roleCode) {
    return userInfo.roleCode === 'super_admin'
  }

  return false
}

/**
 * 阻止点击事件
 */
function preventClick(event) {
  event.preventDefault()
  event.stopPropagation()
  event.stopImmediatePropagation()
  return false
}

/**
  * 隐藏元素
  * @param {HTMLElement} el 要隐藏的元素
  */
 function hideElement(el) {
    // 检查是否为下拉菜单项（通过class或父元素判断）
     const isDropdownItem = el.classList.contains('el-dropdown-menu__item') || 
                           el.parentElement?.classList.contains('el-dropdown-menu') ||
                           el.getAttribute('role') === 'menuitem'
     
     if (isDropdownItem) {
       // 对于下拉菜单项，使用特殊处理方式
        el.setAttribute('hidden', 'hidden')
        el.setAttribute('aria-hidden', 'true')
        // 添加一个类名标记，方便后续识别
        el.classList.add('permission-hidden')
       // 设置样式确保隐藏
       el.style.display = 'none'
       el.style.visibility = 'hidden'
       el.style.opacity = '0'
       el.style.position = 'absolute'
       el.style.pointerEvents = 'none'
    } else {
      // 对于其他元素，使用 display: none
      el.style.display = 'none'
    }
  }

/**
  * 显示元素
  * @param {HTMLElement} el 要显示的元素
  */
 function showElement(el) {
    // 检查是否为下拉菜单项（通过class或父元素判断）
    const isDropdownItem = el.classList.contains('el-dropdown-menu__item') || 
                          el.parentElement?.classList.contains('el-dropdown-menu') ||
                          el.getAttribute('role') === 'menuitem' ||
                          el.classList.contains('permission-hidden')
    
    if (isDropdownItem) {
       // 对于下拉菜单项，移除 hidden 属性和样式
        el.removeAttribute('hidden')
        el.removeAttribute('aria-hidden')
        el.classList.remove('permission-hidden')
       // 恢复样式
       el.style.display = ''
       el.style.visibility = ''
       el.style.opacity = ''
       el.style.position = ''
       el.style.pointerEvents = ''
    } else {
      // 对于其他元素，恢复 display 样式
      el.style.display = ''
    }
  }

/**
 * 权限检查工具函数
 * @param {String|Array} permission 权限标识或权限数组
 * @param {String} mode 权限模式：'any'（任一满足，默认）或 'all'（全部满足）
 * @param {Object} authStore 认证store实例
 * @returns {Boolean} 是否有权限
 */
export function checkPermission(permission, mode = 'any', authStore) {
  if (!authStore) {
    authStore = useAuthStore()
  }

  // 检查是否为超级管理员
  const isSuperAdmin = checkIsSuperAdmin(authStore)
  if (isSuperAdmin) {
    return true
  }

  if (Array.isArray(permission)) {
    if (mode === 'all') {
      // 数组模式：所有权限都满足
      return permission.every(perm => authStore.hasPermission(perm))
    } else {
      // 数组模式：任一权限满足即可
      return permission.some(perm => authStore.hasPermission(perm))
    }
  } else {
    // 字符串模式：需要精确匹配
    return authStore.hasPermission(permission)
  }
}